﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.IO;

namespace HabraReader
{
    public partial class MainForm : Form
    {
        #region Переменные
        // Таймер обновления
        private Timer UpdateTimer = new Timer();        
        // Загруженные посты
        private Posts ParsedPosts = null;
        // Имя последнего поста
        private String LastPostName = null;
        // Ссылка на хабракат текущей статьи, если есть конечно
        private String HabraCutString = null;
        // Ссылка на комментарии
        private String CommentsString = null;
        #endregion
        #region Инициализация
        public MainForm()
        {
            InitializeComponent();
        }
        #endregion        
        #region Управляющие методы
        private void UpdateData()// Обновить данные со страницы
        {
            new HTMLLoader(AppSettings.Settings.URL).PageLoadComplete += new EventHandler(
                delegate(Object sender, EventArgs args) 
                {
                    ParsedPosts = HTMLParser.ParsePosts(sender as String);// Парсим заного весь html
                    UpdatePostsList();// Обновляем данные в treeview
                    // Фокусируем выделение на первом элементе и эмулируем клик мышью
                    PostsList.Items[0].Focused = true;
                    PostsList.Items[0].Selected = true;
                    PostsList_Click(null, new EventArgs());
                    // Появились ли новые посты
                    if (LastPostName != ParsedPosts[0].PostTitle.PostTitle)
                    {
                        TrayIcon.ShowBalloonTip(4000, "Новые посты!", "На Хабрахабре новые посты!", ToolTipIcon.Info);
                        LastPostName = ParsedPosts[0].PostTitle.PostTitle;
                    }
                }
                );             
        }

        private void UpdatePostsList()// Метод для обновления данных в treeview
        {
            if (PostsList.Items.Count != 0)
                PostsList.Items.Clear();
            PostsList.BeginUpdate();
            for (int i = 0; i < ParsedPosts.Count; i++)
            {
                PostsList.Items.Add(ParsedPosts[i].PostTitle.BlogTitle).SubItems.Add(ParsedPosts[i].PostTitle.PostTitle);                
            }
            PostsList.EndUpdate();
        }
        #endregion

        private void MainForm_Load(object sender, EventArgs e)
        {
            AppSettings.Load();            
            UpdateData();// Первая загрузка
            //Указывать время обновления нужно в минутах!
            UpdateTimer.Interval = AppSettings.Settings.UpdateTime * 60 * 1000;
            //Что делать при срабатывании таймера
            UpdateTimer.Tick += new EventHandler(
                delegate(Object send, EventArgs args) 
                {
                    UpdateData();
                    if (AppSettings.Settings.ShowNotice)
                        TrayIcon.ShowBalloonTip(4000, "Обновлено!", "Список постов обновлён!", ToolTipIcon.Info);
                }
                );
            if(AppSettings.Settings.EnableAutoUpdate)
                UpdateTimer.Start();// Начать авто-обновление
        }       

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            AppSettings.Save();
        }      

        private void UpdateButton_Click(object sender, EventArgs e)
        {
            UpdateData();
        }      

        private void PostsList_Click(object sender, EventArgs e)
        {
            // Проверяем на наличие хабраката, если есть то присваиваем хабракату значение и показываем ссылку, иначе скрываем
            if (ParsedPosts[PostsList.SelectedItems[0].Index].PostContent.HabraCutLink != null)
            {
                HabraCutLinkLabel.Visible = true;
                HabraCutString = ParsedPosts[PostsList.SelectedItems[0].Index].PostContent.HabraCutLink;                
            }
            else
            {
                HabraCutLinkLabel.Visible = false;
            }
            // Проверяем на наличие ссылки на комменты. Малоли что...
            if (ParsedPosts[PostsList.SelectedItems[0].Index].PostInfoPanel.CommentsLink != null)
            {
                CommentsLinkLabel.Visible = true;
                CommentsString = ParsedPosts[PostsList.SelectedItems[0].Index].PostInfoPanel.CommentsLink;
            }
            else
            {
                CommentsLinkLabel.Visible = false;
            }
            // Заменяем <br> и <br/> на перенос строки
            PostText.Text = Regex.Replace(ParsedPosts[PostsList.SelectedItems[0].Index].PostContent.TextContent, "<br>|<br/>", "\n", RegexOptions.Multiline | RegexOptions.IgnoreCase);
            // Пишем автора
            AuthorNameLabel.Text = ParsedPosts[PostsList.SelectedItems[0].Index].PostInfoPanel.Author;
            // Пишем количество добавивших в избранное
            FavsCountLabel.Text = Convert.ToString(ParsedPosts[PostsList.SelectedItems[0].Index].PostInfoPanel.FavsCount);
        }

        private void HabraCutLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            System.Diagnostics.Process.Start(HabraCutString);
        }

        private void CommentsLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            System.Diagnostics.Process.Start(CommentsString);
        }

        private void ConfigButton_Click(object sender, EventArgs e)
        {
            new SettingsForm().Visible = true;
        }
    }
}
